home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / net / parnet-3.2 / extras / parpc / amigafiles / sources / lock.asm < prev    next >
Assembly Source File  |  1995-03-09  |  3KB  |  118 lines

  1.  
  2.         ;   long var[2] = { 0, 0 };
  3.         ;
  4.         ;   These routines provide fast exclusive
  5.         ;   locks.
  6.         ;
  7.         ;   LockAddr(&var[0]:A0)
  8.         ;   UnlockAddr(&var[0]:A0)
  9.         ;   TryLockAddr(&var[0]:A0)
  10.  
  11.         section __MERGED,DATA
  12.  
  13.         xref    _SysBase
  14.  
  15.         section text,CODE
  16.  
  17.         include "exec/types.i"
  18.         include "exec/ports.i"
  19.         include "exec/tasks.i"
  20.         include "exec/execbase.i"
  21.         include "exec/ables.i"
  22.         include "exec/memory.i"
  23.  
  24.         xref    _LVOWait
  25.         xref    _LVOForbid
  26.         xref    _LVOPermit
  27.         xref    _LVOSignal
  28.  
  29.         xdef    _LockAddr
  30.         xdef    _UnlockAddr
  31.         xdef    _TryLockAddr
  32.  
  33. _TryLockAddr:
  34.         move.l    4(sp),A0
  35.         moveq.l #0,D0
  36.  
  37.         bset.b    D0,4(A0)                ; attempt to gain lock
  38.         bne    .tla10            ; failure
  39.         moveq.l #1,D0
  40.         rts                ; success, return 1
  41. .tla10        moveq.l #-1,D0            ; failure, return -1
  42.         rts
  43.  
  44. _LockAddr:                    ; bit: 0     lock: A0
  45.         move.l    4(sp),A0
  46.         moveq.l #0,D0
  47.  
  48.         bset.b    D0,4(A0)                ; attempt to gain lock
  49.         bne    .la10            ; failure
  50.         rts                ; success, done, rts (FAST)
  51.  
  52. .la10        movem.l A2/A6,-(sp)             ; failure (SLOW) (BLOCK)
  53.         move.l    _SysBase,A6        ; A6 = SYSBase
  54.         FORBID
  55.         bset.b    D0,4(A0)                ; try again after FORBID
  56.         beq    .la20            ; got it!
  57.  
  58.         ;   Put linked list structure on stack
  59.  
  60.         move.w    D0,-(sp)                ; bit#    12(sp)
  61.         move.l    ThisTask(A6),-(sp)      ; task#    8(sp)
  62.         move.l    A0,-(sp)                ; &var     4(sp)
  63.         move.l    (A0),-(sp)              ; Next      (sp)
  64.         move.l    sp,(A0)                 ; (put at head of list)
  65.  
  66.         ;   Loop Wait/re-attempt lock
  67.  
  68. .la15        moveq.l #$10,D0         ; wait (semaphore signal)
  69.         jsr    _LVOWait(A6)
  70.  
  71.         move.w    12(sp),D0               ; try for lock
  72.         move.l    4(sp),A0
  73.         bset.b    D0,4(A0)
  74.         bne    .la15            ; loop until get it
  75.  
  76. .la16        cmp.l    (A0),sp                 ; unlink, find our node!
  77.         beq    .la18
  78.         move.l    (A0),A0
  79.         bra    .la16
  80. .la18        move.l    (sp),(A0)
  81.         add.w    #14,sp
  82. .la20
  83.         PERMIT
  84.         movem.l (sp)+,A2/A6
  85.         rts
  86.  
  87. _UnlockAddr:    move.l    4(sp),A0
  88.         moveq.l #0,D0
  89.  
  90.         bclr.b    D0,4(A0)                ; clear lock bit
  91.         move.l    (A0),D1                 ; anybody waiting?
  92.         beq    .ulrts            ; no, rts
  93.  
  94.         movem.l D2/A2/A6,-(sp)          ; yes, wake 'm all up
  95.         move.b    D0,D2            ; D2 = bit#
  96.         move.l    _SysBase,A6        ; A6 = SYSBase
  97.         FORBID
  98.  
  99.         move.l    (A0),D1                 ; get pointer again after FORBID
  100.         beq    .ul20            ; no, rts (close a window)
  101.  
  102. .ul10        move.l    D1,A2            ; A2 = node
  103.         cmp.b    13(A2),D2               ; waiting on our bit #?
  104.         bne    .ul18            ; no
  105.         move.l    8(A2),A1                ; yes, signal the node
  106.         moveq.l #$10,D0
  107.         jsr    _LVOSignal(A6)          ; signal EVERYONE waiting
  108. .ul18        move.l    (A2),D1                 ; next
  109.         bne    .ul10
  110.  
  111. .ul20
  112.         PERMIT
  113.         movem.l (sp)+,D2/A2/A6
  114. .ulrts        rts
  115.  
  116.  
  117.         END
  118.